import dslProgramGen.DslClassesGen;
import dslProgramGen.DslProgramGen;
import methodCallTreeGen.MethodCallTreeGen;
import preProcessTrace.FilterTraces;

import java.io.FileNotFoundException;

import static utils.Utils.deleteExsitDstFolder;

public class TracesToMOPGen {
    public static void main(String[] args) throws FileNotFoundException {
        // 用户在使用前需要配置以下参数
        // 参数1 运行的Java程序main函数所在的主类名
        FilterTraces.mainClassName = "com/google/common/cache/SegmentBenchmark";

        // ------------------
        // 下面的参数主要是debug用
        // 表示是否开启debug，debug会输出生成MOP程序前的traces，还会生成哪些函数内容相同合在了一起，会更加耗时
        DslProgramGen.isDebug = false;
        // 表示输出为Java程序还是DSL程序，true为Java程序，false为DSL程序 "for debug"
        DslProgramGen.isGenJavaProgram = false;
        // 表示是否进行强制类型转换
        DslProgramGen.isCastType = true;
        // 表示是否将多线程 每个线程的MOP程序合并到一起
        DslProgramGen.isGenOneMopProgram = true;
        // 这里不检查trace的正确性，debug用
        MethodCallTreeGen.checkTrace = false;
        MethodCallTreeGen.ignoreCheckTraceError = true;
        // 源trace文件所在的路径
        String srcTracesFilePath = "src/main/resources/input/trace.txt";
        // 输入 插桩的JVM记录下来的Class信息文件所在路径
        String classFileInputPath = "src/main/resources/input/class.txt";
        // trace清洗后的内容所在的文件夹路径，注意如果路径存在，会删除该路径里的所有文件和文件夹
        String filteredFolderPath = "src/main/resources/output/debug/filteredTraces/";
        // 如果output目录存在，则删除
        deleteExsitDstFolder("src/main/resources/output/");

        // 输出生成好的MOP程序所在的文件夹路径（输出内容包括两部分，一是内存操作MOP程序，二是DSL语言表示的Class文件），注意如果该文件夹路径存在，会删除该文件夹里面的所有内容
        String mopProgramFolderPath = "src/main/resources/output/mopProgram/";

        long startTime = System.currentTimeMillis();
        // 预处理
        System.out.println("开始Traces预处理...");
        FilterTraces.filterTraceRecords(srcTracesFilePath, filteredFolderPath);
        System.out.println("开始转换Traces生成MOP程序...");
        // 产生内存操作MOP程序
        DslProgramGen.genDslProgramForAllThreads(filteredFolderPath, mopProgramFolderPath);

        // 生成DSL语言表示的Classes文件
        DslClassesGen parser = new DslClassesGen(classFileInputPath, mopProgramFolderPath);
        parser.parse();

        System.out.println("成功转换Traces生成MOP程序...");
        long endTime = System.currentTimeMillis();
        long executionTime = endTime - startTime;
        System.out.println("用时: " + executionTime / 1000.0 / 3600.0 + "小时");
    }
}
